Intro

창발적? 이라는 단어를 처음 들었다.
구글에 검색해보니, 뜻은 다음과 같다.

창발 또는 떠오름 현상은 하위 계층에는 없는 특성이나 행동이
상위 계층(전체 구조)에서 자발적으로 돌연히 출현하는 현상이다.
또한 불시에 솟아나는 특성을 창발성(Emergent Property) 또는
이머전스(Emergence) 라고도 부른다.

창발적 설계로 깔끔한 코드를 구현하자

켄트 벡이 제시한 단순한 설계 규칙 네 가지를 적용하면
SRP나 DIP와 같은 원칙을 적용하기 쉬워진다.
켄트 벡은 다음 규칙을 따르면 설계는 ‘단순하다’고 말한다.

  • 모든 테스트를 실행한다.
  • 중복을 없앤다.
  • 프로그래머 의도를 표현한다.
  • 클래스와 메서드 수를 최소로 줄인다.

단순한 설계 규칙 1: 모든 테스트를 실행하라

어떠한 프로그램을 만들었을 때, 검증되지 않으면 무용지물이다.
검증되지 않은 프로그램은 절대 출시해서는 안 된다.
그렇기에 모든 테스트를 만들어야 하는데, SRP를 준수하면 단순해진다.

결합도가 높으면 테스트 케이스를 작성하기 어렵다.
DIP를 적용하고 DI, 인터페이스, 추상화 등과 같은 도구로 결합도를 낮춘다.

즉, 테스트 케이스를 작성하면 설계 품질이 높아진다.

단순한 설계 규칙 2 ~ 4: 리팩터링

코드를 정리하면서 시스템이 깨질까 걱정할 필요가 없다.  
테스트 케이스가 있으니까!

리팩터링 단계에서는 소프트웨어 설계 품질을 높이는 방법이라면 뭐든 괜찮다.
응집도 높이고, 결합도 낮추고, 관심사 분리하고, 모듈로 나누고,
함수와 클래스 크기를 줄이고, 더 나은 네이밍을 하는 등 다양한 기법을 동원하자.

중복을 없애라

중복은 추가 작업, 추가 위험, 불필요한 복잡도를 뜻한다.

TEMPLATE METHOD 패턴은 고차원 중복을 제거할 목적으로 자주 사용하는 기법이다.
쉽게 얘기하면 공통된 부분을 따로 빼는 것이다.

표현하라

유지보수의 비용은 생각보다 크다.
그렇기에 개발자의 의도를 잘 표현해야 다른 개발자가 이해하기 쉽고,
유지보수 비용이 적게 든다.

  1. 좋은 이름을 선택하자.
  2. 함수와 클래스 크기를 가능한 줄이자.
  3. 표준 명칭을 사용하자.(표준 패턴을 사용한다면 클래스 이름에 패턴 이름을 넣어주자)
  4. 단위 테스트 케이스를 꼼꼼히 작성하자.

클래스와 메서드 수를 최소로 줄여라

클래스와 함수 수를 줄이는 작업도 중요하지만,
테스트 케이스를 만들고 중복을 제고하고 의도를 표현하는 작업이
더 중요하다.

결론

경험을 대신할 단순한 개발 기법이 있을까?
당연히 없다
또 이번 장에는 이런걸 느꼈다.
리팩터링보다 더 중요한 것은 테스트 케이스라는 것을.